#include <iostream>
#include <map>
#include <string>
#include "map_learn.h"

void map_curd()
{
    std::map<std::string, int> map1;

    //==元素插入===========================================
    // 第一种 用insert函數插入pair key存在时插入失败
    map1.insert(std::pair<std::string, int>("one", 1));

    // 第二种 用insert函数插入value_type数据 key存在时插入失败
    map1.insert(std::map<std::string, int>::value_type("three", 3));

    // 第三种 用"array"方式插入 key存在时会覆盖
    map1["four"] = 4;

    map1.emplace("two", 2); // C++11 更高效

    //==元素查找===========================================
    // 使用operator[]（注意键不存在时自动插入默认值）：
    int value = map1["one"];

    // find迭代器查找
    auto it = map1.find("one");
    if (it != map1.end())
    {
        std::cout << "one: " << it->second << std::endl; // 安全访问
    }

    // 元素遍历
    for (const auto &kv : map1)
    { // kv.first ==> key kv.second ==> value
        std::cout << kv.first << ": " << kv.second << std::endl;
    }
    // 存在性检测 使用count检查存在性（返回0或1）
    if (map1.count("one"))
    {
        std::cout << "one exists" << std::endl;
    }

    // 删除
    // 按key删除
    auto count = map1.erase("one"); // （返回删除的数量）
    // 按迭代器删除
    for (auto it = map1.begin(); it != map1.end();)
    {
        // if (condition) 可以增加过滤条件
        it = map1.erase(it); // C++11 起返回下一有效迭代器
        ++it;
    }
}
void map_learn()
{
    map_curd();
}